var move = false;
var psnType;
var psn;
var txt_s;
var txt_e;
(function ($) {
    $.extend({
        //获取鼠标当前坐标
        mouseCoords: function (ev) {
            if (ev.pageX || ev.pageY) {
                return { x: ev.pageX, y: ev.pageY };
            }
            return {
                x: ev.clientX + document.body.scrollLeft - document.body.clientLeft,
                y: ev.clientY + document.body.scrollTop - document.body.clientTop
            };
        },
        //获取样式值
        getStyle: function (obj, styleName) {
            return obj.currentStyle ? obj.currentStyle[styleName] : document.defaultView.getComputedStyle(obj, null)[styleName];
            //                return obj.currentStyle ? obj.currentStyle[styleName] : document.defaultView.getComputedStyle(obj,null).getPropertyValue(styleName);
        }
    }); 
    // 元素拖拽插件
    $.fn.dragDrop = function (options) {
        var opts = $.extend({}, $.fn.dragDrop.defaults, options);
        return this.each(function () {
            //是否正在拖动
            var bDraging = false;
            //移动的元素
            var moveEle = $(this);
            var x = moveEle.position().left;
            var y = moveEle.position().top; 
            var focuEle = opts.focuEle ? $(opts.focuEle, moveEle) : moveEle;

            var dragParams = { initDiffX: '', initDiffY: '', moveX: '', moveY: '' };
            focuEle.bind('mousedown', function (e) {
                //标记开始移动
                bDraging = true;
                //改变鼠标形状 
                moveEle.css({ 'cursor': 'move'});
                //捕获事件。（该用法，还有个好处，就是防止移动太快导致鼠标跑出被移动元素之外）
                if (moveEle.get(0).setCapture) {
                    moveEle.get(0).setCapture();
                } 

                dragParams.initDiffX = $.mouseCoords(e).x - moveEle.position().left;
                dragParams.initDiffY = $.mouseCoords(e).y - moveEle.position().top;

            });

            //移动过程
            var moveTg=1;
            focuEle.bind('mousemove', function (e) {
                if (bDraging) {
                    move=true;
                    moveTg++;
                    //被移动元素的新位置，实际上鼠标当前位置与原位置之差
                    //实际上，被移动元素的新位置，也可以直接是鼠标位置，这也能体现拖拽，但是元素的位置就不会精确。
                    dragParams.moveX = $.mouseCoords(e).x - dragParams.initDiffX;
                    dragParams.moveY = $.mouseCoords(e).y - dragParams.initDiffY;
                    //是否限定在某个区域中移动.
                    //fixarea格式: [x轴最小值,x轴最大值,y轴最小值,y轴最大值]
                    if (opts.fixarea) {
                        if (dragParams.moveX < opts.fixarea[0]) {
                            dragParams.moveX = opts.fixarea[0]
                        }
                        if (dragParams.moveX > opts.fixarea[1]) {
                            dragParams.moveX = opts.fixarea[1]
                        }
                        if (dragParams.moveY < opts.fixarea[2]) {
                            dragParams.moveY = opts.fixarea[2]
                        }
                        if (dragParams.moveY > opts.fixarea[3]) {
                            dragParams.moveY = opts.fixarea[3]
                        }
                    }
                    $("#copy").show();
                    $("#copy").addClass("fxbj");
                    $("#copy").text(moveEle.text());
                    $("#copy").css({ 'left': dragParams.moveX+50, 'top': dragParams.moveY+30 });
                    //移动方向：可以是不限定、垂直、水平。
                    if (opts.dragDirection == 'all') {
                        //DOM写法： document.getElementById('***').style.left = '***px'; 
                        moveEle.css({ 'left': dragParams.moveX, 'top': dragParams.moveY });
                    }
                    else if (opts.dragDirection == 'vertical') {
                        moveEle.css({ 'top': dragParams.moveY });
                    }
                    else if (opts.dragDirection == 'horizontal') {
                        moveEle.css({ 'left': dragParams.moveX });
                    }
                    //如果有回调
                    if (opts.callback) {
                        //将dragParams作为参数传递
                        opts.callback.call(opts.callback, dragParams);
                    }
                    if(moveTg<=2 && move){
                        SetRange(); 
                    }
                }

            });

            //鼠标弹起时，标记为取消移动
            focuEle.bind('mouseup', function (e) {
                bDraging = false;
                moveEle.css({ 'cursor': 'default' });
                if (moveEle.get(0).releaseCapture) {
                    moveEle.get(0).releaseCapture();
                }
                if(move){
                var mt=$.trim(moveEle.text());
                    if ($("#edit").val() == "") {
                        $("#edit").val(mt); 
                    }
                    else { 
                        var rng = document.selection.createRange();   
                        if(rng.text!=""){  
                            $("#edit").val(txt_s+mt+txt_e);
                        }else if(psnType==0){
                            $("#edit").val(mt+$("#edit").val());
                        }else if(psnType==1){
                            $("#edit").val($("#edit").val()+mt);
                        }
                    }
                    initMoveTxt(mt);
                    $("#edit").focus();
                    psn = $("#edit").val().length;
                    moveEle.css({ 'top': y, 'left': x });
                    $("#copy").hide();
                    move=false;
                    moveTg=1;
                }
            });
        });
    };
    //默认配置
    $.fn.dragDrop.defaults =
	        {
	            focuEle: null,            //点击哪个元素开始拖动,可为空。不为空时，需要为被拖动元素的子元素。
	            callback: null,            //拖动时触发的回调。
	            dragDirection: 'all',    //拖动方向：['all','vertical','horizontal']
	            fixarea: null            //限制在哪个区域拖动,以数组形式提供[minX,maxX,minY,maxY]
	        };
})(jQuery);
 

function getValue(objid, str) {
    var myField = document.getElementById(objid);
    //IE浏览器
    if (document.selection) {
        myField.focus();
        sel = document.selection.createRange();
        sel.text = str;
        sel.select();
    } 
    else if (myField.selectionStart || myField.selectionStart == '0') {
        //得到光标前的位置
        var startPos = myField.selectionStart;
        //得到光标后的位置
        var endPos = myField.selectionEnd;
        // 在加入数据之前获得滚动条的高度
        var restoreTop = myField.scrollTop;
        myField.value = myField.value.substring(0, startPos) + str + myField.value.substring(endPos, myField.value.length);
        //如果滚动条高度大于0
        if (restoreTop > 0) {
            // 返回
            myField.scrollTop = restoreTop;
        }
        myField.focus();
        myField.selectionStart = startPos + str.length;
        myField.selectionEnd = startPos + str.length;
    }
    else {
        myField.value += str;
        myField.focus();
    }
}
//取光标位置
function GetCursorPsn(txb) {
    if(document.activeElement.id==txb){
    var slct = document.selection;
    var rng = slct.createRange();
    document.getElementById(txb).select();
    rng.setEndPoint("StartToStart", slct.createRange());
    psn = rng.text.length;
    rng.collapse(false);
    rng.select();
    }
    return psn;
}
function InitRange(id) {
    var div = document.getElementById(id);
    if (document.selection) {
        // for IE
        var r = document.body.createTextRange();
        r.moveToElementText(div);
        r.moveEnd("character");
        r.select();
    } else {
        // For others
        var s = window.getSelection();
        var r = document.createRange();
        r.selectNode(div);
        s.addRange(r);
    }
}
function initMoveTxt(v) { 
    var i=v.indexOf("<");
    var j=$("#edit").val().indexOf(v);
    if(i>-1 && v.indexOf(">")>-1){
//       var r =document.getElementById("edit").createTextRange(); 
//       r.moveStart('character',i+j); 
//       r.collapse(true); 
//       r.select(); 
       SetRange(i+j);
    }
}
function SetRange(setPsn) {
    if(setPsn>0){
        psn=setPsn;
    }else{
        psn = GetCursorPsn("edit")-1; 
    }
    var val = $("#edit").val();
    if(psn==0 || $.trim($("#edit").val().substr(0,psn))=="")
        psnType=0;
    else if(psn>=val.length)
        psnType=1;
    else{
        psnType=2;
        if((val.length-psn)==1){
            psnType=1;
        }
        var s = val.lastIndexOf("<", psn);
        var e = val.indexOf(">", psn)-1;
        txt_s=val.substr(0,s);
        txt_e=val.substr(e+2,val.length-e)
        var txtFocus = document.getElementById("edit");
        var range = txtFocus.createTextRange();
        range.moveStart("character", -val.length);
        range.moveEnd("character", -val.length);
        range.collapse(true);

        range.moveStart("character", s);
        range.moveEnd("character", e - s + 2);
        if (range.text.length > 2) {
            var str = range.text.substr(1, range.text.length - 2);
            if (str.indexOf(",") == -1 && str.indexOf("<") == -1 && str.indexOf(">") == -1) {
                range.select();
            }
        }
    }
}
 